package middleware

import (
	"ourplansystem/server/models"
	"strings"

	"github.com/gofiber/fiber/v2"
	"github.com/golang-jwt/jwt/v5"
)

// JWT 密钥（必须与 auth.go 中的密钥一致）
var jwtSecret = []byte("ourplansystem_secret_key_2025")

// JWTClaims JWT 声明结构
type JWTClaims struct {
	UserID      int64  `json:"user_id"`
	Username    string `json:"username"`
	DisplayName string `json:"display_name"`
	jwt.RegisteredClaims
}

// JWTAuth JWT 认证中间件
func JWTAuth() fiber.Handler {
	return func(c *fiber.Ctx) error {
		// 获取 Authorization 头
		authHeader := c.Get("Authorization")
		if authHeader == "" {
			return models.Unauthorized(c, "缺少认证Token")
		}

		// 验证格式: Bearer <token>
		parts := strings.SplitN(authHeader, " ", 2)
		if len(parts) != 2 || parts[0] != "Bearer" {
			return models.Unauthorized(c, "Token格式错误")
		}

		tokenString := parts[1]

		// 解析 Token
		token, err := jwt.ParseWithClaims(tokenString, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
			return jwtSecret, nil
		})

		if err != nil {
			return models.Unauthorized(c, "Token无效或已过期")
		}

		// 验证 Token 有效性
		if claims, ok := token.Claims.(*JWTClaims); ok && token.Valid {
			// 将用户信息存储到上下文中，供后续处理器使用
			c.Locals("user_id", claims.UserID)
			c.Locals("username", claims.Username)
			c.Locals("display_name", claims.DisplayName)
			return c.Next()
		}

		return models.Unauthorized(c, "Token验证失败")
	}
}
